package com.bjpowernode.springboot.controller;

import com.bjpowernode.springboot.entity.OfficeDocumentBean;
import com.bjpowernode.springboot.entity.PageBean;
import com.bjpowernode.springboot.service.DocumentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 文档控制层
 */
@Controller
@RequestMapping("/do-doc")
@SuppressWarnings("all")
public class DocumentController {

    @Autowired
    private DocumentService documentService;


    /**
     * 添加文档到数据库中
     * @return
     */
    @RequestMapping("/do-put")
    public ModelAndView addDocument(HttpServletRequest request) {
        ModelAndView mv = new ModelAndView();
        String docName = request.getParameter("docName");
        String docUrl = request.getParameter("docUrl");
        OfficeDocumentBean odb = new OfficeDocumentBean(); // 封装文档Bean对象
        odb.setDocName(docName);
        odb.setDocUrl(docUrl);
        // 添加之前，我们需要判断是否已经存在，如果存在就不需要添加到数据库中
        List<OfficeDocumentBean> officeDocumentBeans = documentService.queryDocuments(); // 查询出所有
        for (OfficeDocumentBean officeDocumentBean : officeDocumentBeans) {
            if (officeDocumentBean.getDocName().equals(docName) && officeDocumentBean.getDocUrl().equals(docUrl)) {
                mv.addObject("feedback","当前文档已经存在,无法添加,请您重新输入");
                mv.setViewName("feedback");
                return mv;
            }
        }
        documentService.addDocument(odb); // 保存
        // 将新的文档添加进去之后，需要重新读取首页需要的数据，并设置到model中，在页面中显示
        PageBean pageBean = new PageBean(1,7);
        List<OfficeDocumentBean> officeDocumentBeans1 = documentService.queryDocumentByPageBean(pageBean);
        int docCount = documentService.countDocuments(); // 获取添加之后的总数
        mv.addObject("documentsList",officeDocumentBeans1);
        mv.addObject("docCount",docCount);
        mv.setViewName("doc-nav-page");

        // 将更新redis中的数据
        /**
         * 这里实际上可以使用SpringBoot中的Quatz定时任务框架实现(没学过),例如每天几时几分开启一个异步线程，实现从mysql中读取数据
         * 然后load到redis中的zset中，当然每次我们添加或者删除文档时，这时主动触发一次定时任务，这样redis中的数据就是实时更新的，
         * 文档排行一定是最新的(学完之后再重构代码吧，这里之采取简单的方式：即每次添加或者删除主动实现mysql---redis)
         */
        documentService.loadToRedis(); // 触发一次更新
        return mv;
    }

    /**
     *  没有问题，数据库中有重复的数据，之前做测试的时候添加了许多重复数据，导致最终的显示结果与对应的访问有误
     * @return
     */
    @RequestMapping("/get-hot-doc")
    public ModelAndView readHot5Doc() {
        ModelAndView mv = new ModelAndView();
        List<OfficeDocumentBean> officeDocumentBeans = documentService.readhot5Doc();
        mv.addObject("documentsList",officeDocumentBeans);
        mv.setViewName("doc-hot");
        return mv;
    }

    @RequestMapping("/do-doc-incr")
    @ResponseBody
    public void docVisIncr(HttpServletRequest request) {
        int curVisDocId = Integer.parseInt(request.getParameter("docId")); // 获取当前访问的docId
        documentService.updataVisCount(curVisDocId); // 更新对应文档的访问次数
        try {
            Thread.sleep(100); // 停顿100ms，保证数据先到mysql中更新，然后走redis进行load操作
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        documentService.loadToRedis(); // 因为当前更新了访问次数，所以排名有可能会变，所以需要重新将数据库中的数据导入到redis中，否则页面无法显示最新的排行
    }
}
